use crate::pb::Spec;
use image::ImageFormat;

mod photon;
pub use photon::Photon;

// 因为 photo_rs 使用简单，这里我们也不太关心更高的性能，就暂且用它。
// 我们知道，有朝一日可能要用不同的 image 引擎替换它，所以我们设计一个 Engine trait
// Engine trait：未来可以添加更多的 engine，主流程只需要替换 engine
pub trait Engine {
    // 对 engine 按照 specs 进行一系列有序的处理
    fn apply(&mut self, specs: &[Spec]);
    // 从 engine 中生成目标图片，注意这里用的是 self，而非 self 的引用
    fn generate(self, format: ImageFormat) -> Vec<u8>;
}

// 那么 apply 方法怎么实现呢？可以再设计一个 trait，这样可为每个 Spec 生成对应处理
// SpecTransform：未来如果添加更多的 spec，只需要实现它即可
pub trait SpecTransform<T> {
    // 对图片使用 op 做 transform
    fn transform(&mut self, op: T);
}
